package com.demo.java.OD151_200.OD164;

import java.util.*;
import java.util.stream.Collectors;

/**
 * @author bug菌
 * @Source 公众号：猿圈奇妙屋
 * @des： 【员工出勤 or 出勤奖的判断】问题
 * @url： https://blog.csdn.net/weixin_43970743/article/details/145778166
 */
public class OdMain {
    public static void main(String[] args) {
        // 创建一个 Scanner 用来读取输入
        Scanner in = new Scanner(System.in);

        // 读取测试数据的组数
        int n = Integer.parseInt(in.nextLine());

        // 创建一个 ArrayList 用于存储每组员工的出勤记录（每组记录是一个 List）
        ArrayList<List<String>> days = new ArrayList<>();

        // 读取每组数据并解析
        for (int i = 0; i < n; i++) {
            // 读取每组出勤记录，并根据空格分割成字符串数组
            String[] split = in.nextLine().split(" ");

            // 将字符串数组转化为 List<String> 类型，方便处理
            List<String> list = Arrays.stream(split)
                    .collect(Collectors.toList());

            // 将每组数据添加到 days 列表中
            days.add(list);
        }

        // 关闭 Scanner
        in.close();

        // 遍历每组数据（即每个员工的出勤记录）
        for (List<String> day : days) {

            // 如果当天的记录包含 "absent"（缺席），则直接输出 false
            // 因为如果缺席了，员工无法获得出勤奖
            if (day.contains("absent")) {
                System.out.print("false ");
                continue; // 继续处理下一个员工
            }

            // flag 用于记录是否满足出勤奖的所有条件
            boolean flag = true;

            // 检查是否存在连续的迟到或早退
            for (int i = 0; i < day.size() - 1; i++) {
                // 当前记录和下一个记录
                String cur = day.get(i);
                String next = day.get(i + 1);

                // 如果当前记录是迟到或早退，并且下一个记录也是迟到或早退
                // 则设置 flag 为 false，表示不符合条件
                if (("late".equals(cur) || "leaveearly".equals(cur)) &&
                        ("late".equals(next) || "leaveearly".equals(next))) {
                    flag = false;
                    break; // 发现不符合条件，跳出循环
                }
            }

            // 如果 flag 为 false，说明存在连续的迟到或早退，输出 false
            if (!flag) {
                System.out.print(flag + " ");
                continue; // 继续处理下一个员工
            }

            // 将出勤记录转化为 0 和 1，其中 "present" 代表 0，"absent" 代表 1
            int[] ints = new int[day.size()];
            for (int i = 0; i < day.size(); i++) {
                ints[i] = "present".equals(day.get(i)) ? 0 : 1;  // 如果是缺席，则记录为 1
            }

            // 如果出勤天数少于 7 天且缺席超过 3 次，则输出 false
            // 这里通过求出所有出勤记录中 "absent" 的总和，判断是否超过 3 次
            if (ints.length <= 7 && Arrays.stream(ints).sum() >= 3) {
                System.out.print("false ");
            } else {
                // 标记是否符合连续 7 天内缺席不超过 3 次的条件
                flag = true;

                // 计算前 7 天的缺席天数
                int sum = Arrays.stream(Arrays.copyOfRange(ints, 0, 7)).sum();

                // 滑动窗口：从第 8 天开始，滑动窗口检查后续的7天内缺席天数
                for (int i = 7; i < ints.length; i++) {
                    // 如果在任何 7 天的窗口中缺席天数超过 3 次，直接标记为不符合条件
                    if (sum >= 3) {
                        flag = false;
                        break; // 如果不符合条件，跳出循环
                    }
                    // 滑动窗口：移除前一天的记录，添加当前天的记录
                    sum += ints[i] - ints[i - 7];
                }

                // 再次检查最后的 7 天窗口（如果已经滑动完）
                if (sum >= 3) {
                    flag = false;
                }

                // 输出最终的判断结果，符合条件输出 true，不符合输出 false
                System.out.print(flag + " ");
            }
        }
    }
}